package com.fx.zmlzml.service.impl;

import com.fx.zmlzml.domain.dto.AhpPcComponentPriceWeightDTO;
import com.fx.zmlzml.domain.dto.BudgetPriceDTO;
import com.fx.zmlzml.domain.dto.BudgetPriceRangeDTO;
import com.fx.zmlzml.service.PcComponentBudgetPriceRangeService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * 硬件组件预算价格范围服务实现类
 *
 * @author zml
 */
@Service
public class PcComponentBudgetPriceRangeServiceImpl implements PcComponentBudgetPriceRangeService {

    @Override
    public BudgetPriceDTO getBudgetPriceRange(AhpPcComponentPriceWeightDTO dto) {
        switch (dto.getLevel()) {
            case "入门级" -> {return getEntryPrice(dto);}
            case "进阶级" -> {return getBalancePrice(dto);}
            case "专业级" -> {return getProPrice(dto);}
            case "大师级" -> {return getMasterPrice(dto);}
            default -> {}
        }
        return null;
    }


    /**
     * 获取入门级预算价格范围
     * @param dto 电脑配件价格权重DTO
     * @return 入门级预算价格范围
     */
    private BudgetPriceDTO getEntryPrice(AhpPcComponentPriceWeightDTO dto) {
        BudgetPriceDTO  result = new BudgetPriceDTO();
        // 主板
        result.setMaxMotherboardPrice(dto.getBudgetPrice().multiply(dto.getPcMotherboard().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.motherboardEntryUpper)).intValue());
        result.setMinMotherboardPrice(dto.getBudgetPrice().multiply(dto.getPcMotherboard().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.motherboardEntryLower)).intValue());
        // CPU
        result.setMaxCpuPrice(dto.getBudgetPrice().multiply(dto.getPcCpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.cpuEntryUpper)).intValue());
        result.setMinCpuPrice(dto.getBudgetPrice().multiply(dto.getPcCpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.cpuEntryLower)).intValue());
        // 散热器
        result.setMaxCoolerPrice(dto.getBudgetPrice().multiply(dto.getPcCooler().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.coolerEntryUpper)).intValue());
        result.setMinCoolerPrice(dto.getBudgetPrice().multiply(dto.getPcCooler().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.coolerEntryLower)).intValue());
        // 显卡
        result.setMaxGpuPrice(dto.getBudgetPrice().multiply(dto.getPcGpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.gpuEntryUpper)).intValue());
        result.setMinGpuPrice(dto.getBudgetPrice().multiply(dto.getPcGpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.gpuEntryLower)).intValue());
        // 内存条
        result.setMaxMemoryPrice(dto.getBudgetPrice().multiply(dto.getPcMemory().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.memoryEntryUpper)).intValue());
        result.setMinMemoryPrice(dto.getBudgetPrice().multiply(dto.getPcMemory().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.memoryEntryLower)).intValue());
        // 硬盘
        result.setMaxHardDiskPrice(dto.getBudgetPrice().multiply(dto.getPcHardDisk().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.hardDiskEntryUpper)).intValue());
        result.setMinHardDiskPrice(dto.getBudgetPrice().multiply(dto.getPcHardDisk().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.hardDiskEntryLower)).intValue());
        // 电源
        result.setMaxPowerSupplyPrice(dto.getBudgetPrice().multiply(dto.getPcPowerSupply().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.powerSupplyEntryUpper)).intValue());
        result.setMinPowerSupplyPrice(dto.getBudgetPrice().multiply(dto.getPcPowerSupply().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.powerSupplyEntryLower)).intValue());
        // 机箱
        result.setMaxCasePrice(dto.getBudgetPrice().multiply(dto.getPcCase().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.caseEntryUpper)).intValue());
        result.setMinCasePrice(dto.getBudgetPrice().multiply(dto.getPcCase().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.caseEntryLower)).intValue());
        return result;
    }

    /**
     * 获取进阶级预算价格范围
     * @param dto 电脑配件价格权重DTO
     * @return 进阶级预算价格范围
     */
    private BudgetPriceDTO getBalancePrice(AhpPcComponentPriceWeightDTO dto) {
        BudgetPriceDTO  result = new BudgetPriceDTO();
        // 主板
        result.setMaxMotherboardPrice(dto.getBudgetPrice().multiply(dto.getPcMotherboard().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.motherboardBalanceUpper)).intValue());
        result.setMinMotherboardPrice(dto.getBudgetPrice().multiply(dto.getPcMotherboard().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.motherboardBalanceLower)).intValue());
        // CPU
        result.setMaxCpuPrice(dto.getBudgetPrice().multiply(dto.getPcCpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.cpuBalanceUpper)).intValue());
        result.setMinCpuPrice(dto.getBudgetPrice().multiply(dto.getPcCpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.cpuBalanceLower)).intValue());
        // 散热器
        result.setMaxCoolerPrice(dto.getBudgetPrice().multiply(dto.getPcCooler().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.coolerBalanceUpper)).intValue());
        result.setMinCoolerPrice(dto.getBudgetPrice().multiply(dto.getPcCooler().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.coolerBalanceLower)).intValue());
        // 显卡
        result.setMaxGpuPrice(dto.getBudgetPrice().multiply(dto.getPcGpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.gpuBalanceUpper)).intValue());
        result.setMinGpuPrice(dto.getBudgetPrice().multiply(dto.getPcGpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.gpuBalanceLower)).intValue());
        // 内存条
        result.setMaxMemoryPrice(dto.getBudgetPrice().multiply(dto.getPcMemory().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.memoryBalanceUpper)).intValue());
        result.setMinMemoryPrice(dto.getBudgetPrice().multiply(dto.getPcMemory().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.memoryBalanceLower)).intValue());
        // 硬盘
        result.setMaxHardDiskPrice(dto.getBudgetPrice().multiply(dto.getPcHardDisk().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.hardDiskBalanceUpper)).intValue());
        result.setMinHardDiskPrice(dto.getBudgetPrice().multiply(dto.getPcHardDisk().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.hardDiskBalanceLower)).intValue());
        // 电源
        result.setMaxPowerSupplyPrice(dto.getBudgetPrice().multiply(dto.getPcPowerSupply().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.powerSupplyBalanceUpper)).intValue());
        result.setMinPowerSupplyPrice(dto.getBudgetPrice().multiply(dto.getPcPowerSupply().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.powerSupplyBalanceLower)).intValue());
        // 机箱
        result.setMaxCasePrice(dto.getBudgetPrice().multiply(dto.getPcCase().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.caseBalanceUpper)).intValue());
        result.setMinCasePrice(dto.getBudgetPrice().multiply(dto.getPcCase().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.caseBalanceLower)).intValue());
        return result;
    }

    /**
     * 获取专业级预算价格范围
     * @param dto 电脑配件价格权重DTO
     * @return 专业级预算价格范围
     */
    private BudgetPriceDTO getProPrice(AhpPcComponentPriceWeightDTO dto) {
        BudgetPriceDTO  result = new BudgetPriceDTO();
        // 主板
        result.setMaxMotherboardPrice(dto.getBudgetPrice().multiply(dto.getPcMotherboard().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.motherboardProUpper)).intValue());
        result.setMinMotherboardPrice(dto.getBudgetPrice().multiply(dto.getPcMotherboard().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.motherboardProLower)).intValue());
        // CPU
        result.setMaxCpuPrice(dto.getBudgetPrice().multiply(dto.getPcCpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.cpuProUpper)).intValue());
        result.setMinCpuPrice(dto.getBudgetPrice().multiply(dto.getPcCpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.cpuProLower)).intValue());
        // 散热器
        result.setMaxCoolerPrice(dto.getBudgetPrice().multiply(dto.getPcCooler().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.coolerProUpper)).intValue());
        result.setMinCoolerPrice(dto.getBudgetPrice().multiply(dto.getPcCooler().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.coolerProLower)).intValue());
        // 显卡
        result.setMaxGpuPrice(dto.getBudgetPrice().multiply(dto.getPcGpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.gpuProUpper)).intValue());
        result.setMinGpuPrice(dto.getBudgetPrice().multiply(dto.getPcGpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.gpuProLower)).intValue());
        // 内存条
        result.setMaxMemoryPrice(dto.getBudgetPrice().multiply(dto.getPcMemory().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.memoryProUpper)).intValue());
        result.setMinMemoryPrice(dto.getBudgetPrice().multiply(dto.getPcMemory().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.memoryProLower)).intValue());
        // 硬盘
        result.setMaxHardDiskPrice(dto.getBudgetPrice().multiply(dto.getPcHardDisk().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.hardDiskProUpper)).intValue());
        result.setMinHardDiskPrice(dto.getBudgetPrice().multiply(dto.getPcHardDisk().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.hardDiskProLower)).intValue());
        // 电源
        result.setMaxPowerSupplyPrice(dto.getBudgetPrice().multiply(dto.getPcPowerSupply().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.powerSupplyProUpper)).intValue());
        result.setMinPowerSupplyPrice(dto.getBudgetPrice().multiply(dto.getPcPowerSupply().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.powerSupplyProLower)).intValue());
        // 机箱
        result.setMaxCasePrice(dto.getBudgetPrice().multiply(dto.getPcCase().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.caseProUpper)).intValue());
        result.setMinCasePrice(dto.getBudgetPrice().multiply(dto.getPcCase().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.caseProLower)).intValue());
        return result;
    }

    /**
     * 获取大师级预算价格范围
     * @param dto 电脑配件价格权重DTO
     * @return 大师级预算价格范围
     */
    private BudgetPriceDTO getMasterPrice(AhpPcComponentPriceWeightDTO dto) {
        BudgetPriceDTO  result = new BudgetPriceDTO();
        // 主板
        result.setMaxMotherboardPrice(dto.getBudgetPrice().multiply(dto.getPcMotherboard().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.motherboardMasterUpper)).intValue());
        result.setMinMotherboardPrice(dto.getBudgetPrice().multiply(dto.getPcMotherboard().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.motherboardMasterLower)).intValue());
        // CPU
        result.setMaxCpuPrice(dto.getBudgetPrice().multiply(dto.getPcCpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.cpuMasterUpper)).intValue());
        result.setMinCpuPrice(dto.getBudgetPrice().multiply(dto.getPcCpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.cpuMasterLower)).intValue());
        // 散热器
        result.setMaxCoolerPrice(dto.getBudgetPrice().multiply(dto.getPcCooler().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.coolerMasterUpper)).intValue());
        result.setMinCoolerPrice(dto.getBudgetPrice().multiply(dto.getPcCooler().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.coolerMasterLower)).intValue());
        // 显卡
        result.setMaxGpuPrice(dto.getBudgetPrice().multiply(dto.getPcGpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.gpuMasterUpper)).intValue());
        result.setMinGpuPrice(dto.getBudgetPrice().multiply(dto.getPcGpu().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.gpuMasterLower)).intValue());
        // 内存条
        result.setMaxMemoryPrice(dto.getBudgetPrice().multiply(dto.getPcMemory().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.memoryMasterUpper)).intValue());
        result.setMinMemoryPrice(dto.getBudgetPrice().multiply(dto.getPcMemory().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.memoryMasterLower)).intValue());
        // 硬盘
        result.setMaxHardDiskPrice(dto.getBudgetPrice().multiply(dto.getPcHardDisk().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.hardDiskMasterUpper)).intValue());
        result.setMinHardDiskPrice(dto.getBudgetPrice().multiply(dto.getPcHardDisk().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.hardDiskMasterLower)).intValue());
        // 电源
        result.setMaxPowerSupplyPrice(dto.getBudgetPrice().multiply(dto.getPcPowerSupply().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.powerSupplyMasterUpper)).intValue());
        result.setMinPowerSupplyPrice(dto.getBudgetPrice().multiply(dto.getPcPowerSupply().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.powerSupplyMasterLower)).intValue());
        // 机箱
        result.setMaxCasePrice(dto.getBudgetPrice().multiply(dto.getPcCase().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.caseMasterUpper)).intValue());
        result.setMinCasePrice(dto.getBudgetPrice().multiply(dto.getPcCase().divide(new BigDecimal(100)).add(BudgetPriceRangeDTO.caseMasterLower)).intValue());

        return result;


    }

}
